package com.demo.k8s.feign;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * FeignClient没有指定url，生成请求的url是http://service-k8s-provider-istio/provoider?name=参数值
 * service-k8s-provider-istio没有匹配VirtualService，所以Istio无法做流量控制。因为VirtualService的host定义了kubernets的服务时，
 * Istio 会根据规则所在的命名空间来处理这一名称，而非服务所在的命名空间。假设 “default” 命名空间的一条规则中包含了一个 service-k8s-provider-istio 的 host 引用，
 * 就会被视为 service-k8s-provider-istio.default，而不会考虑 service-k8s-provider-istio 服务所在的命名空间。
 * 所以VirtualService的hosts也是service-k8s-provider-istio.default。
 * <p>
 * 因为Feign生成url只有服务名service-k8s-provider-istio，无法匹配VirtualService的host。所以必须指定url，格式：http://服务名.命名空间:服务端口
 * 这样才能匹配到VirtualService
 * <p>
 * 通过istioctl proxy-config route pod名称，可以看到路由配置，也能查看VirtualService的hosts名称
 * <p>
 * Istio VirtualService 虚拟服务介绍：
 * <a href="https://www.cnblogs.com/haoyunlaile/p/12915924.html">https://www.cnblogs.com/haoyunlaile/p/12915924.html</a><br>
 * Istio 流量管理基础概念：<a href="https://jimmysong.io/istio-handbook/concepts/traffic-management-basic.html">https://jimmysong.io/istio-handbook/concepts/traffic-management-basic.html</a>
 */
@FeignClient(name = "service-k8s-provider-istio", url = "http://service-k8s-provider-istio.default:8666")
public interface KubernestProviderIstioFeign {

    @GetMapping("/provider")
    String provider(@RequestParam("name") String name);
}
